package com.school.sports.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.school.sports.entity.Backup;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 备份服务接口
 * 处理数据库备份和恢复相关的业务逻辑
 */
public interface BackupService extends IService<Backup> {

    /**
     * 执行数据库备份
     * @param backupName 备份名称
     * @param backupType 备份类型（全量、增量）
     * @param operatorId 操作人ID
     * @return 备份记录
     */
    Backup performBackup(String backupName, String backupType, Long operatorId);

    /**
     * 从备份文件恢复数据库
     * @param backupFile 备份文件
     * @param operatorId 操作人ID
     * @return 恢复结果
     */
    Map<String, Object> restoreFromBackup(MultipartFile backupFile, Long operatorId);

    /**
     * 从已存在的备份记录恢复数据库
     * @param backupId 备份记录ID
     * @param operatorId 操作人ID
     * @return 恢复结果
     */
    Map<String, Object> restoreFromBackupRecord(Long backupId, Long operatorId);

    /**
     * 分页查询备份记录
     * @param currentPage 当前页码
     * @param pageSize 每页显示数量
     * @param backupName 备份名称（可选）
     * @param backupType 备份类型（可选）
     * @param operatorId 操作人ID（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 分页结果
     */
    IPage<Backup> getBackupPage(Integer currentPage, Integer pageSize,
                              String backupName, String backupType, Long operatorId,
                              LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据操作人查询备份记录
     * @param operatorId 操作人ID
     * @return 备份记录列表
     */
    List<Backup> getBackupsByOperator(Long operatorId);

    /**
     * 根据备份类型查询备份记录
     * @param backupType 备份类型
     * @return 备份记录列表
     */
    List<Backup> getBackupsByType(String backupType);

    /**
     * 获取最近的备份记录
     * @param limit 限制数量
     * @return 备份记录列表
     */
    List<Backup> getRecentBackups(Integer limit);

    /**
     * 删除备份记录和文件
     * @param backupId 备份记录ID
     * @return 删除结果
     */
    boolean deleteBackup(Long backupId);

    /**
     * 批量删除备份记录和文件
     * @param backupIds 备份记录ID列表
     * @return 删除结果
     */
    boolean batchDeleteBackups(List<Long> backupIds);

    /**
     * 下载备份文件
     * @param backupId 备份记录ID
     * @return 备份文件路径
     */
    String downloadBackupFile(Long backupId);

    /**
     * 验证备份文件完整性
     * @param backupId 备份记录ID
     * @return 验证结果
     */
    Map<String, Object> validateBackupFile(Long backupId);

    /**
     * 获取备份统计信息
     * @return 统计信息
     */
    Map<String, Object> getBackupStatistics();

    /**
     * 创建自动备份任务
     * @param backupName 备份名称
     * @param backupType 备份类型
     * @param scheduleExpression 定时表达式（如：0 0 2 * * ? 每天凌晨2点）
     * @param operatorId 操作人ID
     * @return 创建结果
     */
    Map<String, Object> createScheduledBackup(String backupName, String backupType,
                                            String scheduleExpression, Long operatorId);

    /**
     * 检查备份文件是否存在
     * @param backupId 备份记录ID
     * @return 是否存在
     */
    boolean checkBackupFileExists(Long backupId);

    /**
     * 获取备份文件大小
     * @param backupId 备份记录ID
     * @return 文件大小（字节）
     */
    Long getBackupFileSize(Long backupId);
}